package com.itheima.api.pms;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mapper.pms.PmsProductCategoryMapper;
import com.itheima.vo.domain.AjaxResult;
import com.itheima.vo.domain.TableDataInfo;
import com.itheima.vo.dto.pms.PmsProductCategoryChildrenDto;
import com.itheima.vo.dto.pms.PmsProductCategoryDto;
import com.itheima.vo.pojo.PmsProductCategory;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.List;

@DubboService
public class PmsProductCategoryServiceImpl extends ServiceImpl<PmsProductCategoryMapper, PmsProductCategory> implements PmsProductCategoryService {

    @Autowired
    private PmsProductCategoryMapper pmsProductCategoryMapper;

    @Autowired
    private PmsProductCategoryAttributeRelationService pmsProductCategoryAttributeRelationService;

    /**
     * 1.添加商品分类
     *
     * @param pmsProductCategoryDto
     * @return
     */
    @Override
    public AjaxResult create(PmsProductCategoryDto pmsProductCategoryDto) {
        //页面没有传递level,需要手动判断是否有父级,查询子父级的时候,需要用到level
        if (pmsProductCategoryDto.getParentId() == 0) {
            //没有父级
            pmsProductCategoryDto.setLevel(0L);
        } else {
            //有父级
            pmsProductCategoryDto.setLevel(1L);
        }
        //先保存pc
        PmsProductCategory pmsProductCategory = new PmsProductCategory();
        BeanUtils.copyProperties(pmsProductCategoryDto, pmsProductCategory);
        //在执行完存入方法后,自动生成id
        pmsProductCategoryMapper.insert(pmsProductCategory);
        //获取pcId
        long pcId = pmsProductCategory.getId();
        // 此外还有productAttributeIdList未处理,集合里面的是paId,当前可以获得到的是pcid,这两个关联的表是pmsProductCategoryAttributeRelation里面
        ArrayList<Integer> productAttributeIdList = pmsProductCategoryDto.getProductAttributeIdList();
        //调用pcarService的保存方法
        pmsProductCategoryAttributeRelationService.save(pcId, productAttributeIdList);
        return AjaxResult.success("添加成功");
    }

    /**
     * 2.删除商品分类
     *
     * @param id
     * @return
     */
    @Override
    public AjaxResult deleteById(Integer id) {

        pmsProductCategoryMapper.deleteById(id);
        return AjaxResult.success("删除成功");
    }

    /**
     * 3.查询所有一级分类及子分类
     *
     * @return
     */
    @Override
    public AjaxResult getListWithChildren() {
        //查询到所有的pc的集合
        List<PmsProductCategory> pcs = pmsProductCategoryMapper.selectList(null);
        //创建返回的对象集合
        ArrayList<PmsProductCategoryChildrenDto> pccDtos = new ArrayList<PmsProductCategoryChildrenDto>();
        //遍历pc查询level为0的(父级),level为1的(子集)
        for (PmsProductCategory pc : pcs) {
            //为0的,就是父级
            if (pc.getLevel() == 0L) {
                //创建返回的单个对象
                PmsProductCategoryChildrenDto pccDto = new PmsProductCategoryChildrenDto();
                //将除了children的数据拷贝到该对象内
                BeanUtils.copyProperties(pc, pccDto);
                //获取该id下的List<children>
                long fid = pc.getId();
                //根据父类id查询子类
                LambdaQueryWrapper<PmsProductCategory> lqw = new LambdaQueryWrapper<>();
                lqw.eq(PmsProductCategory::getParentId, fid);
                //List<children>
                List<PmsProductCategory> children = pmsProductCategoryMapper.selectList(lqw);
                //将没有children的存入返回的集合中
                pccDto.setChildren(children);

                //再将整个对象封装到pccDtos中
                pccDtos.add(pccDto);
            }
        }
        return AjaxResult.success(pccDtos);
    }

    /**
     * 4.分页查询商品分类
     *
     * @param parentId
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Override
    public AjaxResult ListByParentId(Integer parentId, Integer pageNum, Integer pageSize) {
        //构造条件查询对象
        LambdaQueryWrapper<PmsProductCategory> lqw = new LambdaQueryWrapper<>();
        //额外进行排序
        lqw.eq(PmsProductCategory::getParentId, parentId).orderByAsc(PmsProductCategory::getSort).orderByAsc(PmsProductCategory::getId);
        //构造分页对象
        Page<PmsProductCategory> pmsProductCategoryPage = new Page<>(pageNum, pageSize);
        Page<PmsProductCategory> page1 = page(pmsProductCategoryPage, lqw);

        //封装对象
        TableDataInfo tInfo = new TableDataInfo();
        tInfo.setList(page1.getRecords());
        tInfo.setPageNum(pageNum);
        tInfo.setPageSize(pageSize);
        tInfo.setTotal(page1.getTotal());
        tInfo.setTotalPage(page1.getPages());
        return AjaxResult.success(tInfo);
    }

    /**
     * 5.修改导航栏显示状态
     *
     * @param ids
     * @param navStatus
     * @return
     */
    @Override
    public AjaxResult updateByNavStatus(ArrayList<Integer> ids, Integer navStatus) {
        //因为改的都是相同的,所以在循环外面将navStatus封装进去
        for (Integer id : ids) {
            //获取当前id的对象,并封装入修改的数值
            PmsProductCategory pmsProductCategory = pmsProductCategoryMapper.selectById(id);
            pmsProductCategory.setNavStatus(navStatus);
            pmsProductCategoryMapper.updateById(pmsProductCategory);
        }
        return AjaxResult.success("修改导航栏显示状态成功");
    }

    /**
     * 6.修改显示状态
     *
     * @param ids
     * @param showStatus
     * @return
     */
    @Override
    public AjaxResult updateByShowStatus(ArrayList<Integer> ids, Integer showStatus) {
        //因为改的都是相同的,所以在循环外面将navStatus封装进去
        for (Integer id : ids) {
            //获取当前id的对象,并封装入修改的数值
            PmsProductCategory pmsProductCategory = pmsProductCategoryMapper.selectById(id);
            pmsProductCategory.setShowStatus(showStatus);
            pmsProductCategoryMapper.updateById(pmsProductCategory);
        }
        return AjaxResult.success("修改显示状态成功");
    }

    /**
     * 7.修改商品分类
     *
     * @param id
     * @param pmsProductCategoryDto
     * @return
     */
    @Override
    public AjaxResult updateById(Integer id, PmsProductCategoryDto pmsProductCategoryDto) {
        //构造查询条件
        LambdaQueryWrapper<PmsProductCategory> lqw = new LambdaQueryWrapper<>();
        lqw.eq(PmsProductCategory::getId, id);
        //先修改pc,存入id和dto中除了list的其他数据
        PmsProductCategory pc = new PmsProductCategory();
        BeanUtils.copyProperties(pmsProductCategoryDto, pc);
        pc.setId(id);
        //更新
        updateById(pc);
        //再保存List
        ArrayList<Integer> paList = pmsProductCategoryDto.getProductAttributeIdList();
        //调用pcarService的更新方法
        pmsProductCategoryAttributeRelationService.updateById(id, paList);

        return AjaxResult.success("修改商品分类成功");
    }

    /**
     * 8.根据id获取商品分类
     * @param id
     * @return
     */
    @Override
    public AjaxResult findById(Integer id) {
        PmsProductCategory pmsProductCategory = pmsProductCategoryMapper.selectById(id);
        return AjaxResult.success(pmsProductCategory);
    }

}
